
# 常规的函数定义和调用
def func(arg1, arg2):
    print(arg1, arg2)

func(3, 7)

# 调用时, 可以指定形参的名字
func(arg2=3, arg1=4)

# ------------下面介绍三种参数传递方式---------------------------------------

print('================1==================')
# 1. 默认参数
def func2(arg1=1, arg2=2 ,arg3=3):
    print(arg1, arg2, arg3)

func2(2, 3, 4)
func2(5, 6)
func2(7)

# 指定部分参数
func2(arg2=8)
func2(arg3=9, arg1=10)

# 混合使用
# 注意: 没有指定参数名的参数必须放在前面, 且参数不能重复
func2(11, arg3=8)

# 错误示例 : func2(15, arg1=16)

print('================2==================')
# 2. *args
# 可以接受任意数量的参数
# 在变量前加上*, 调用时的参数会存储在一个tuple元组对象中
# tuple是有序的, args中元素的顺序受到赋值时的影响
def calcSum(*args):
    sum = 0
    for i in args:
        sum+=i
    print(sum)

calcSum(1, 2, 3)
calcSum(123, 3)
calcSum()

print('================3==================')
# **kargs
# func(**kargs) 把参数以字典的形式传入
# 字典是无序的, 采用这种传递方法, 可以不受参数数量,位置的限制
def printAll(**kargs):
    for k in kargs:
        print(k, ':', kargs[k])

printAll(a=1, b=2, c=3)
printAll(x=4, y=5)

print("=============综合===============")
# 前面三种参数调用方法, 可以混合使用
# 注意事项: 必须保证顺序是 (无默认值形参, 有默认值形参, 元组参数, 字典参数)
# 调用时也要遵守规定 : 指定参数名称的参数要在无指定参数名称的参数之后, 不可重复传递

def funcc(x, y=5, *a, **b):
    print(x, y, a, b)

funcc(1)
funcc(1, 2)
funcc(1, 2, 3)
funcc(1, 2, 3, 4)
funcc(1, 2, 3, 4, k=1, t=2)
